package com.sky.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.constant.MessageConstant;
import com.sky.constant.StatusConstant;
import com.sky.context.BaseContext;
import com.sky.dto.CategoryDTO;
import com.sky.dto.CategoryPageQueryDTO;
import com.sky.entity.Category;
import com.sky.exception.DeletionNotAllowedException;
import com.sky.mapper.CategoryMapper;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.result.PageResult;
import com.sky.service.CategoryService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;


@Service
public class CategoryServiceImpl implements CategoryService {

  @Autowired
  CategoryMapper categoryMapper;
  @Autowired
  DishMapper dishMapper;
  @Autowired
  SetmealMapper setmealMapper;

  /**
   * 分类分页查询
   * @param categoryPageQueryDTO
   * @return
   */
  @Override
  public PageResult page(CategoryPageQueryDTO categoryPageQueryDTO) {
    PageHelper.startPage(categoryPageQueryDTO.getPage(), categoryPageQueryDTO.getPageSize());
    Page<Category> page = categoryMapper.pageQuery(categoryPageQueryDTO);
    PageResult pageResult = new PageResult(page.getTotal(), page.getResult());
    return pageResult;
  }

  /**
   * 启用禁用分类
   * @param id
   * @param status
   */
  @Override
  public void startOrStop(Long id, Integer status) {
    Category category = new Category().builder()
        .id(id)
        .status(status)
        .build();
    categoryMapper.update(category);
  }

  /**
   * 修改分类
   * @param categoryDTO
   */
  @Override
  public void update(CategoryDTO categoryDTO) {
    Category category = new Category();
    BeanUtils.copyProperties(categoryDTO, category);
    // 通过反射实现统一设置
//    // 设置更新时间和修改人
//    category.setUpdateTime(LocalDateTime.now());
//    category.setUpdateUser(BaseContext.getCurrentId());

    categoryMapper.update(category);
  }

  /**
   * 新增分类
   * @param categoryDTO
   */
  @Override
  public void save(CategoryDTO categoryDTO) {
    Category category = new Category();
    BeanUtils.copyProperties(categoryDTO, category);
    // 默认新分类为禁用
    category.setStatus(StatusConstant.DISABLE);
    // 通过反射实现统一设置
//    // 设置创建时间和作者，以及更新时间和作者
//    category.setCreateUser(BaseContext.getCurrentId());
//    category.setUpdateUser(BaseContext.getCurrentId());
//    category.setUpdateTime(LocalDateTime.now());
//    category.setCreateTime(LocalDateTime.now());

    categoryMapper.insert(category);
  }

  /**
   * 删除分类
   * @param id
   */
  @Override
  public void delete(Integer id) {
    // 查询该分类是否关联菜品
    Integer count = dishMapper.countByCategoryId(id);
    if(count > 0){
      // 当前分类关联菜品未删除，删除失败
      throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_DISH);
    }
    // 查询该分类是否关联套餐
    count = setmealMapper.countByCategoryId(id);
    if(count > 0){
      // 当前分类关联套餐未删除，删除失败
      throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_SETMEAL);
    }

    categoryMapper.delete(id);
  }

  /**
   * 根据类型查询分类
   *
   * @param type
   * @return List<Category>
   */
  @Override
  public List<Category> list(Integer type) {
    return categoryMapper.list(type);
  }

}
